package com.wx.gof.pattern.structural.composite.abstracttype;

/**
 * @ClassName Application
 * @Author wx
 * @Description
 * 定义:
 * 组合模式属于对象的结构模式，有时又叫做“部分——整体”模式。合成模式将对象组织到树结构中，
 * 可以用来描述整体与部分的关系。组合模式可以使客户端将单纯元素与复合元素同等看待。
 * 组合模式目的是：让客户端不再区分操作的是树枝对象还是树叶对象，而是以一个统一的方式来操作
 * 适用场景:
 * 1.希望客户端忽略单个元素与复合元素的差异时
 * 2.处理一个树形结构
 * 优点:
 * 1.清楚的定义分层次的复杂对象，表示对象的全部或部分层次
 * 2.让客户端忽略了层次的差异，方便对整个层次结构进行控制
 * 3.简化客户端代码，原因是第二条
 * 缺点:
 * 1.限制类型时会比较复杂-某个节点下只能放文件或者文本，你需要在程序里面去做判断
 * 理解:
 * 应用程序-组合设计模式-抽象版(符合开闭原则，适用于忽略组合对象与单个对象的差异,比如树形结构)
 * @Date 2018-12-09-21:30
 */
public class Application {
    public static void main(String[] args) {
        CatalogComponent linuxCourse = new Course("Linux课程",11);
        CatalogComponent windowsCourse = new Course("Windows课程",11);

        CatalogComponent javaCourseCatalog = new CourseCatalog("Java课程目录",2);

        CatalogComponent mmallCourse1 = new Course("Java基础",55);
        CatalogComponent mmallCourse2 = new Course("Java进阶",66);
        CatalogComponent designPattern = new Course("Java设计模式",77);

        javaCourseCatalog.add(mmallCourse1);
        javaCourseCatalog.add(mmallCourse2);
        javaCourseCatalog.add(designPattern);

        CatalogComponent imoocMainCourseCatalog = new CourseCatalog("课程主目录",1);
        imoocMainCourseCatalog.add(linuxCourse);
        imoocMainCourseCatalog.add(windowsCourse);
        imoocMainCourseCatalog.add(javaCourseCatalog);

        imoocMainCourseCatalog.print();



    }
}
